/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Hua YY
 * Date: 2024-08-19
 * Time: 21:03
 */
class Food {
}
class Fruit extends Food {
}
class Apple extends Fruit {
}
class Banana extends Fruit {
}
class Plate<T> { // 设置泛型
    private T message ;
    public T getMessage() {
        return message;
    }
    public void setMessage(T message) {
        this.message = message;
    }
}
public class Test2 {
    public static void main(String[] args) {
        Plate<Fruit> plate = new Plate<>();
        Plate<Food> plate2 = new Plate<>();

        fun(plate);
        fun2(plate2);
    }
    public static void fun2(Plate<? super Fruit> temp){//通配符的下界
        /*得到的都是Fruit或者Fruit的父类类型
        * 这时候去引用儿子类就没有问题*/
        temp.setMessage(new Apple());
        temp.setMessage(new Banana());
        temp.setMessage(new Fruit());


        //temp.setMessage(new Food());//不行

        //Fruit fruit = temp.getMessage();传过来的都是Fruit或者Fruit的父类,不能兼收并蓄
        //在形象点，可能传过来个大的，用小的接肯定不行

    }


    public static void main1(String[] args) {
        Plate<Apple> plate = new Plate<>();
        Plate<Banana> plate2 = new Plate<>();//传入的参数类型必须是Fruit或者它的子类

        fun(plate);
        fun(plate2);

    }


    public static void fun(Plate<? extends Fruit> temp ){//通配符的上界
        //因为放的时候不知道放的是什么类型，所以就不行，关键就是setMassage是有参数的方法
       /* temp.setMessage(new Apple());
        temp.setMessage(new Banana());
        temp.setMessage(new Fruit());*/

        Fruit fruit = temp.getMessage();//向上转型
        //Banana fruit = temp.getMessage();
        // 因为不知道返回的是（哪一种）子类还是父类类型，所以直接用父类类型能涵盖多种

        System.out.println(temp.getMessage());
    }

}
